//在大多数语言中，从列表中间删除一个数据，都会造成一个数据，都会造成之后的数据重排，是个较低效率的操作。
//

function randomSelect(source, m) {
  const result = [];
  for (let i = 0, n = source.length; i < m; i++) {
    const rIndex = ~~Math.random() * n;
    --n;
    //交换选中位置的数据和当前最后一个位置的数据
    [source[rIndex],source[n]] = [source[n],source[rIndex]];
  }
  //把后面m个数据返回出来就是随机选中的
  return source.slice(-m);  // -m 和 source.length - m 等效
}

randomSelect([1, 2, 3], 2);
